<?php
/**
 * 短信
 * User: 我想有个家
 * Date: 2019/1/28
 * Time: 19:09
 */

namespace App\Service;


use App\Lib\Redis;

class SmsService {
    /**
     * @var AliService
     */
    private $ali;

    public function __construct(AliService $ali) {
        $this->ali = $ali;
    }

    /**
     * 验证码校验
     * @param $mobile string 手机号
     * @param $code string 验证码
     * @return string 返回错误信息。空值表示验证通过
     */
    public function verify($mobile, $code) {
        $key = "mc:{$mobile}";
        $redis = Redis::get();
        $log = json_decode($redis->get($key), true);
        if (empty($log) || $log['code'] != $code) {
            return '验证码错误';
        }
        // 删除缓存
        $redis->del($key);
        return '';
    }

    /**
     * 发送这验证码
     * @param $mobile string 手机号码
     * @return string
     */
    public function sendVerifyCode($mobile) {
        // redis键名
        $key = "mc:{$mobile}";
        $redis = Redis::get();
        // 一分钟只能发送一个
        $log = json_decode($redis->get($key), true);
        if ($log) {
            if ($_SERVER['REQUEST_TIME'] - $log['time'] <= 60) {
                return '一分钟内只能发送一次';
            }
            $redis->del($key);
        }
        $code = rand(100000, 999999);
        $result = $this->send($mobile, $this->signName, $this->templateCdoe, ['code' => $code]);
        if ($result) {
            return $result;
        } else {
            $redis->set($key, [
                'code' => $code,
                'time' => time()
            ], 300);
            return '';
        }
    }

    /**
     * 发送短信
     * @param string $mobile 手机号码
     * @param string $signName 签名
     * @param string $templateCdoe 模板编号
     * @param array $param 参数
     * @return string
     */
    public function send(string $mobile, string $signName, string $templateCdoe, array $param) {
        return $this->ali->sendSms($mobile, $signName, $templateCdoe, $param);
    }
}
